<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}
/**
 * 栖岛账号登录插件，支持使用栖岛账号登录Typecho
 * 
 * @package QidaoConnect
 * @author 艺当然
 * @version 1.0.0
 * @link https://www.qidao.tvcloud.top/
 */
class QidaoConnect_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件方法,如果激活失败,直接抛出异常
     *
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function activate()
    {
        $info = self::installDb();

        // 建立oauth路由
        Helper::addRoute('qidao_oauth', '/qidao_oauth', 'QidaoConnect_Widget', 'oauth');
        Helper::addRoute('qidao_callback', '/qidao_callback', 'QidaoConnect_Widget', 'callback');
        
        // 确保redirect.php文件可访问
        $redirectFile = __DIR__ . '/redirect.php';
        if (!file_exists($redirectFile)) {
            throw new Typecho_Plugin_Exception('重定向文件不存在，请检查插件安装是否完整');
        }
        
        // 检查插件目录是否可写
        if (!is_writable(__DIR__)) {
            throw new Typecho_Plugin_Exception('插件目录不可写，请设置正确的权限');
        }

        return _t($info);
    }

    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     *
     * @static
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function deactivate()
    {
        Helper::removeRoute('qidao_oauth');
        Helper::removeRoute('qidao_callback');
        // 删除数据表
        return self::removeTable();
    }

    /**
     * 获取插件配置面板
     *
     * @access public
     * @param Typecho_Widget_Helper_Form $form 配置面板
     * @return void
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        // 栖岛账号申请链接提示
        echo '<div style="margin: 15px 0; padding: 10px; background-color: #f8f9fa; border-left: 4px solid #6cf;">
            <p>还没有栖岛账号？<a href="https://open.tvcloud.top/admin/register.php" target="_blank" style="color: #0088cc; text-decoration: underline;">点击这里</a> 前往栖岛平台注册账号。</p>
            <p>注册后，您需要创建应用并获取应用ID和密钥。</p>
        </div>';
        
        // 应用ID
        $appId = new Typecho_Widget_Helper_Form_Element_Text('app_id', NULL, '', _t('应用ID(Client ID)'), _t('栖岛开放平台申请的应用ID'));
        $form->addInput($appId);
        
        // 应用密钥
        $appSecret = new Typecho_Widget_Helper_Form_Element_Text('app_secret', NULL, '', _t('应用密钥(Client Secret)'), _t('栖岛开放平台申请的应用密钥'));
        $form->addInput($appSecret);
        
        // 回调域
        $callback = new Typecho_Widget_Helper_Form_Element_Text('callback', NULL, Typecho_Common::url('/qidao_callback', Typecho_Widget::Widget('Widget_Options')->index), _t('回调地址'), _t('请将此地址设置到栖岛开放平台的回调域中'));
        $form->addInput($callback->setAttribute('readonly', 'readonly'));
        
        // 自定义授权域
        $scope = new Typecho_Widget_Helper_Form_Element_Text('scope', NULL, 'email screen_name avatar url', _t('授权域(Scope)'), _t('授权域，多个权限用空格分隔，例如：profile email user_name screen_name avatar url'));
        $form->addInput($scope);
        
        // 是否需要完善资料
        $custom = new Typecho_Widget_Helper_Form_Element_Radio('custom', array(1 => _t('是'), 0 => '否'), 0, _t('是否需要完善资料'), _t('用户使用栖岛账号登录后，是否需要完善昵称、邮箱等信息；选择不需要完善资料则直接使用获取到的昵称。'));
        $form->addInput($custom);
        
        // 默认用户组
        $defaultGroup = new Typecho_Widget_Helper_Form_Element_Select(
            'default_group',
            array(
                'visitor' => _t('访客') . ' - ' . _t('只能浏览网站内容，无其他权限'),
                'subscriber' => _t('订阅者') . ' - ' . _t('能够发表评论，无法发布文章'),
                'contributor' => _t('贡献者') . ' - ' . _t('能够发表评论、发布文章，但文章需要审核'),
                'editor' => _t('编辑') . ' - ' . _t('能够发表评论、发布和审核文章，但无法修改系统设置'),
                'administrator' => _t('管理员') . ' - ' . _t('拥有所有权限，包括修改系统设置')
            ),
            'subscriber',
            _t('默认用户组'),
            _t('栖岛用户登录后默认的用户组权限，不同用户组拥有不同的操作权限')
        );
        $form->addInput($defaultGroup);
        
        // 特权邮箱
        $privilegeEmails = new Typecho_Widget_Helper_Form_Element_Textarea(
            'privilege_emails',
            null,
            '',
            _t('特权邮箱列表'),
            _t('这些邮箱的栖岛用户将获得管理员权限，一行一个邮箱')
        );
        $form->addInput($privilegeEmails);
        
        // 开发者信息
        echo '<div style="margin-top: 20px; padding: 10px; background-color: #f8f9fa; border-top: 1px solid #ddd;">
            <p>栖岛账号登录插件 v1.0.0 | 开发者：艺当然</p>
            <p>如有问题，请联系开发者或访问 <a href="https://web.tvcloud.top/" target="_blank">栖岛平台</a></p>
        </div>';
    }

    /**
     * 个人用户的配置面板
     *
     * @access public
     * @param Typecho_Widget_Helper_Form $form
     * @return void
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {
    }

    /**
     * 安装数据库
     */
    public static function installDb()
    {
        try {
            return self::addTable();
        } catch (Typecho_Db_Exception $e) {
            if ('42S01' == $e->getCode()) {
                $msg = '数据表qidao_connect已存在!';
                return $msg;
            }
        }
    }
    
    // 添加数据表
    public static function addTable()
    {
        $db = Typecho_Db::get();
        $prefix = $db->getPrefix();
        if ("Pdo_Mysql" === $db->getAdapterName() || "Mysql" === $db->getAdapterName()) {
            $sql = "CREATE TABLE IF NOT EXISTS `{$prefix}qidao_connect` (
                  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
                  `uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
                  `openid` char(50) NOT NULL,
                  `access_token` varchar(255) NOT NULL DEFAULT '0' COMMENT '用户对应access_token',
                  `refresh_token` varchar(255) NOT NULL DEFAULT '0' COMMENT '刷新有效期token',
                  `expires_in` int(10) unsigned NOT NULL DEFAULT '0',
                  `datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后登录',
                  `name` varchar(38) NOT NULL DEFAULT '0',
                  `nickname` varchar(38) NOT NULL DEFAULT '0',
                  `gender` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '性别0未知,1男,2女',
                  `head_img` varchar(255) NOT NULL DEFAULT '0' COMMENT '头像',
                  PRIMARY KEY (`id`),
                  KEY `uid` (`uid`),
                  KEY `openid` (`openid`)
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";
            $db->query($sql);
        } else {
            throw new Typecho_Plugin_Exception(_t('对不起, 本插件仅支持MySQL数据库。'));
        }
        return "数据表qidao_connect安装成功！";
    }
    
    // 删除数据表
    public static function removeTable()
    {
        $db = Typecho_Db::get();
        $prefix = $db->getPrefix();
        try {
            $db->query("DROP TABLE `" . $prefix . "qidao_connect`", Typecho_Db::WRITE);
        } catch (Typecho_Exception $e) {
            return "删除qidao_connect表失败！";
        }
        return "删除qidao_connect表成功！";
    }
    
    // 在前端显示登录按钮
    public static function loginBtn($text = false)
    {
        $options = Typecho_Widget::Widget('Widget_Options');
        $appId = $options->plugin('QidaoConnect')->app_id;
        
        if (empty($appId)) {
            return '';
        }
        
        $url = Typecho_Common::url('/qidao_oauth', $options->index);
        
        if ($text) {
            // 文本样式
            return '<a href="' . $url . '" title="栖岛登录">栖岛登录</a>';
        } else {
            // 按钮样式
            $iconPath = __DIR__ . '/login_ico/qidao.png';
            $iconUrl = file_exists($iconPath) 
                ? $options->pluginUrl . '/QidaoConnect/login_ico/qidao.png' 
                : $options->pluginUrl . '/QidaoConnect/login_ico/qidao.svg';
            return '<a href="' . $url . '"><img src="' . $iconUrl . '" alt="栖岛登录" style="margin-top: 0.8em; width: 32px; height: 32px;"></a>';
        }
    }
} 